package org.xmap.util;
import java.util.Vector;
/**
 * <p>支持排序的Vector，线程同步。</p>
 * @author Zealot
 * @version 1.0
 */
public final class SortVector extends Vector {
    /**
     * 定义顺序的排序方式。
     */
    public static final int ORDER = 0;
    /**
     * 定义逆序的排序方式。
     */
    public static final int REVERSE = 1;
    /**
     * 排序，true为从小到大，false为从大到小。
     */
    private boolean order = true;
    /**
     * 设置排序顺序，之前的元素会重新排序。
     * @param order int 排序顺序。
     */
    public synchronized void setOrder(int order) {
        if (order == SortVector.ORDER) {
            if (!this.order) {
                this.order = true;
                this.reverseObj();
            }
        } else {
            if (this.order) {
                this.order = false;
                this.reverseObj();
            }
        }
    }
    /**
     * 返回排序顺序。
     * @return int 排序顺序。
     */
    public int getOrder() {
        if (this.order) {
            return SortVector.ORDER;
        } else {
            return SortVector.REVERSE;
        }
    }
    /**
     * 添加一个指定的排序对象。
     * @param obj Sortable 排序对象。
     */
    public synchronized void addElement(Sortable obj) {
        boolean add = false;
        for (int i = 0; i < this.size(); i++) {
            Sortable s = (Sortable)this.elementAt(i);
            if (s.getValue() >= obj.getValue()) {
                this.insertElementAt(obj, i);
                add = true;
                break;
            }
        }
        if (!add) {
            super.addElement(obj);
        }
    }
    /**
     * 移除一个排序对象。
     * @param obj Sortable 排序对象。
     */
    public synchronized void removeElement(Sortable obj) {
        if (obj != null) {
            super.removeElement(obj);
        }
    }
    /**
     * 颠倒所有的对象。
     */
    private void reverseObj() {
        for (int i = 0; i < (this.elementCount >> 1); i++) {
            Object bak = this.elementData[i];
            this.elementData[i] = this.elementData[this.elementCount - i - 1];
            this.elementData[this.elementCount - i - 1] = bak;
        }
    }
}
